%
% sphinx.sty
%
% Adapted from the old python.sty, mostly written by Fred Drake,
% by Georg Brandl.
%

\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{sphinx}[2022/06/30 v5.1.0 LaTeX package (Sphinx markup)]

% provides \ltx@ifundefined
% (many packages load ltxcmds: graphicx does for pdftex and lualatex but
% not xelatex, and anyhow kvoptions does, but it may be needed in future to
% use \sphinxdeprecationwarning earlier, and it needs \ltx@ifundefined)
\RequirePackage{ltxcmds}

%% for deprecation warnings
\newcommand\sphinxdeprecationwarning[4]{% #1 the deprecated macro or name,
% #2 = when deprecated, #3 = when removed, #4 = additional info
  \edef\spx@tempa{\detokenize{#1}}%
  \ltx@ifundefined{sphinx_depr_\spx@tempa}{%
     \global\expandafter\let\csname sphinx_depr_\spx@tempa\endcsname\spx@tempa
     \expandafter\AtEndDocument\expandafter{\expandafter\let\expandafter
         \sphinxdeprecatedmacro\csname sphinx_depr_\spx@tempa\endcsname
         \PackageWarningNoLine{sphinx}{^^J**** SPHINX DEPRECATION WARNING:^^J
         \sphinxdeprecatedmacro^^J
         \@spaces- is deprecated at Sphinx #2^^J
         \@spaces- and removed at Sphinx #3.^^J
         #4^^J****}}%
  }{% warning already emitted (at end of latex log), don't repeat
  }}


%% OPTION HANDLING
%

% We generally first handle options then load packages, but we need
% \definecolor from xcolor/color to handle the options.

% MEMO: xcolor \fcolorbox coloured boxes render better in some PDF viewers
% than with color package \fcolorbox.  Since 1.6.3, Sphinx uses only its own
% custom variant of \fcolorbox when handling verbatim code.  Currently (last
% checked at 5.0.0) \fcolorbox is used for admonitions (sphinxheavybox)
% and appears also in Pygmentize output mark-up.
\IfFileExists{xcolor.sty}{
    \RequirePackage{xcolor}
}{
    \RequirePackage{color}
}
% the \colorlet of xcolor (if at all loaded) is overkill for our use case
\newcommand{\sphinxcolorlet}[2]
    {\expandafter\let\csname\@backslashchar color@#1\expandafter\endcsname
                     \csname\@backslashchar color@#2\endcsname }


% Handle options via "kvoptions" (later loaded by hyperref anyhow)
\RequirePackage{kvoptions}
\SetupKeyvalOptions{prefix=spx@opt@} % use \spx@opt@ prefix

% Sphinx legacy text layout: 1in margins on all four sides
\ifx\@jsc@uplatextrue\@undefined
\DeclareStringOption[1in]{hmargin}
\DeclareStringOption[1in]{vmargin}
\DeclareStringOption[.5in]{marginpar}
\else
% Japanese standard document classes handle \mag in a special way
\DeclareStringOption[\inv@mag in]{hmargin}
\DeclareStringOption[\inv@mag in]{vmargin}
\DeclareStringOption[.5\dimexpr\inv@mag in\relax]{marginpar}
\fi

\DeclareStringOption[0]{maxlistdepth}% \newcommand*\spx@opt@maxlistdepth{0}
\DeclareStringOption[-1]{numfigreset}
\DeclareBoolOption[false]{nonumfigreset}
\DeclareBoolOption[false]{mathnumfig}
\define@key{sphinx}{bookmarksdepth}{\AtBeginDocument{\hypersetup{bookmarksdepth=#1}}}
\AtBeginDocument{\define@key{sphinx}{bookmarksdepth}{\hypersetup{bookmarksdepth=#1}}}
% \DeclareBoolOption[false]{usespart}% not used
% dimensions, we declare the \dimen registers here.
\newdimen\sphinxverbatimsep    % <-- TO BE REMOVED NOT USED ANYMORE AT 5.1.0
\newdimen\sphinxverbatimborder
%
% \DeclareStringOption is not convenient for the handling of these dimensions
% because we want to assign the values to the corresponding registers. Even if
% we added the code to the key handler it would be too late for the initial
% set-up and we would need to do initial assignments explicitly. We end up
% using \define@key directly.
% verbatim
\sphinxverbatimsep=\fboxsep    % <-- TO BE REMOVED NOT USED ANYMORE AT 5.1.0
  \define@key{sphinx}{verbatimsep}{\sphinxverbatimsep\dimexpr #1\relax}
\sphinxverbatimborder=\fboxrule
  \define@key{sphinx}{verbatimborder}{\sphinxverbatimborder\dimexpr #1\relax}
\DeclareBoolOption[true]{verbatimwithframe}
\DeclareBoolOption[true]{verbatimwrapslines}
\DeclareBoolOption[false]{verbatimforcewraps}
\DeclareStringOption[3]{verbatimmaxoverfull}
\DeclareStringOption[100]{verbatimmaxunderfull}
\DeclareBoolOption[true]{verbatimhintsturnover}
\DeclareBoolOption[true]{inlineliteralwraps}
\DeclareStringOption[t]{literalblockcappos}
\DeclareStringOption[r]{verbatimcontinuedalign}
\DeclareStringOption[r]{verbatimcontinuesalign}
% parsed literal
\DeclareBoolOption[true]{parsedliteralwraps}
% \textvisiblespace for compatibility with fontspec+XeTeX/LuaTeX
\DeclareStringOption[\textcolor{red}{\textvisiblespace}]{verbatimvisiblespace}
\DeclareStringOption % must use braces to hide the brackets
  [{\makebox[2\fontcharwd\font`\x][r]{\textcolor{red}{\tiny$\m@th\hookrightarrow$}}}]%
  {verbatimcontinued}
% topic boxes
% alternative names and definitions in 5.1.0 section below
\newdimen\sphinxshadowsep  % <-- TO BE REMOVED NOT USED ANYMORE AT 5.1.0
\newdimen\sphinxshadowsize % <-- TO BE REMOVED NOT USED ANYMORE AT 5.1.0
\newdimen\sphinxshadowrule
\sphinxshadowsep=5pt
  \define@key{sphinx}{shadowsep}{\sphinxshadowsep\dimexpr #1\relax}%
\sphinxshadowsize=4pt
  \define@key{sphinx}{shadowsize}{\sphinxshadowsize\dimexpr #1\relax}
\sphinxshadowrule=\fboxrule % catches current value (probably 0.4pt)
  \define@key{sphinx}{shadowrule}{\sphinxshadowrule\dimexpr #1\relax}
% notices/admonitions
% the dimensions for notices/admonitions are kept as macros and assigned to
% \spx@notice@border at time of use, hence \DeclareStringOption is ok for this
\newdimen\spx@notice@border
\DeclareStringOption[0.5pt]{noteborder}
\DeclareStringOption[0.5pt]{hintborder}
\DeclareStringOption[0.5pt]{importantborder}
\DeclareStringOption[0.5pt]{tipborder}
\DeclareStringOption[1pt]{warningborder}
\DeclareStringOption[1pt]{cautionborder}
\DeclareStringOption[1pt]{attentionborder}
\DeclareStringOption[1pt]{dangerborder}
\DeclareStringOption[1pt]{errorborder}
% footnotes
\DeclareStringOption[\mbox{ }]{AtStartFootnote}
% we need a public macro name for direct use in latex file
\newcommand*{\sphinxAtStartFootnote}{\spx@opt@AtStartFootnote}
% no such need for this one, as it is used inside other macros
\DeclareStringOption[\leavevmode\unskip]{BeforeFootnote}
% some font styling.
\DeclareStringOption[\sffamily\bfseries]{HeaderFamily}
% colours
% same problems as for dimensions: we want the key handler to use \definecolor.
% first, some colours with no prefix, for backwards compatibility
\newcommand*{\sphinxDeclareColorOption}[2]{%
   \definecolor{#1}#2%
   \define@key{sphinx}{#1}{\definecolor{#1}##1}%
}%
\sphinxDeclareColorOption{TitleColor}{{rgb}{0.126,0.263,0.361}}
\sphinxDeclareColorOption{InnerLinkColor}{{rgb}{0.208,0.374,0.486}}
\sphinxDeclareColorOption{OuterLinkColor}{{rgb}{0.216,0.439,0.388}}
\sphinxDeclareColorOption{VerbatimColor}{{rgb}{1,1,1}}
\sphinxDeclareColorOption{VerbatimBorderColor}{{rgb}{0,0,0}}
% now the colours defined with "sphinx" prefix in their names
\newcommand*{\sphinxDeclareSphinxColorOption}[2]{%
   % set the initial default
   \definecolor{sphinx#1}#2%
   % set the key handler. The "value" ##1 must be acceptable by \definecolor.
   \define@key{sphinx}{#1}{\definecolor{sphinx#1}##1}%
}%
% Default color chosen to be as in minted.sty LaTeX package!
\sphinxDeclareSphinxColorOption{VerbatimHighlightColor}{{rgb}{0.878,1,1}}
% admonition boxes, "light" style
\sphinxDeclareSphinxColorOption{noteBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{hintBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{importantBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{tipBorderColor}{{rgb}{0,0,0}}
% admonition boxes, "heavy" style
\sphinxDeclareSphinxColorOption{warningBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{cautionBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{attentionBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{dangerBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{errorBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{warningBgColor}{{rgb}{1,1,1}}
\sphinxDeclareSphinxColorOption{cautionBgColor}{{rgb}{1,1,1}}
\sphinxDeclareSphinxColorOption{attentionBgColor}{{rgb}{1,1,1}}
\sphinxDeclareSphinxColorOption{dangerBgColor}{{rgb}{1,1,1}}
\sphinxDeclareSphinxColorOption{errorBgColor}{{rgb}{1,1,1}}
%%%%%%%%
%
% Additions at 5.1.0
%
% In future, an alternative user interface will perhaps be provided via
% CSS-like input in a configuration variable latex_css, and Sphinx
% will then parse it into the \sphinxsetup options described it. 
%
% In the meantime we adopt already some CSS-like names.  However,
% attention to not use these options as genuine CSS properties, only
% very limited syntax is supported.
%
\def\spxstring@none{none}
\def\spxstring@clone{clone}
% Future: should below all the macros holding dimensions be defined via some
% \edef and \dimexpr rather?
%
% Deliberately the code avoids creating (except by \let) new \dimen variables
% besides the legacy ones already defined.
%
% code-blocks
\let\spxdimen@pre@border\sphinxverbatimborder
\define@key{sphinx}{pre_border-top-width}{\def\spx@pre@border@top{#1}}
\define@key{sphinx}{pre_border-right-width}{\def\spx@pre@border@right{#1}}
\define@key{sphinx}{pre_border-bottom-width}{\def\spx@pre@border@bottom{#1}}
\define@key{sphinx}{pre_border-left-width}{\def\spx@pre@border@left{#1}}
% currently accepts only one dimension specification
\define@key{sphinx}{pre_border-width}{%
   \spxdimen@pre@border\dimexpr #1\relax
   \def\spx@pre@border@top  {\spxdimen@pre@border}%
   \let\spx@pre@border@right \spx@pre@border@top
   \let\spx@pre@border@bottom\spx@pre@border@top
   \let\spx@pre@border@left  \spx@pre@border@top
}
\def\spx@pre@border@top  {\spxdimen@pre@border}%
\let\spx@pre@border@right \spx@pre@border@top
\let\spx@pre@border@bottom\spx@pre@border@top
\let\spx@pre@border@left  \spx@pre@border@top
\expandafter\let\expandafter\KV@sphinx@verbatimborder
                            \csname KV@sphinx@pre_border-width\endcsname
\newif\ifspx@pre@border@open % defaults to false (at least for 5.x series)
\define@key{sphinx}{pre_box-decoration-break}%
           {\begingroup\edef\spx@tempa{#1}\expandafter\endgroup
            \ifx\spx@tempa\spxstring@clone
                 \spx@pre@border@openfalse
            \else\spx@pre@border@opentrue\fi}
%
% MEMO: \sphinxverbatimsep not used anywhere anymore in the code, to be removed
\define@key{sphinx}{pre_padding-top}{\def\spx@pre@padding@top{#1}}
\define@key{sphinx}{pre_padding-right}{\def\spx@pre@padding@right{#1}}
\define@key{sphinx}{pre_padding-bottom}{\def\spx@pre@padding@bottom{#1}}
\define@key{sphinx}{pre_padding-left}{\def\spx@pre@padding@left{#1}}
\define@key{sphinx}{pre_padding}{%
   \def\spx@pre@padding@top   {#1}% use some pre \dimexpr expansion?
   \let\spx@pre@padding@right \spx@pre@padding@top
   \let\spx@pre@padding@bottom\spx@pre@padding@top
   \let\spx@pre@padding@left  \spx@pre@padding@top
}
\edef\spx@pre@padding@top {\number\fboxsep sp}% \sphinxverbatimsep to be removed
\let\spx@pre@padding@right \spx@pre@padding@top
\let\spx@pre@padding@bottom\spx@pre@padding@top
\let\spx@pre@padding@left  \spx@pre@padding@top
\expandafter\let\expandafter\KV@sphinx@verbatimsep
                            \csname KV@sphinx@pre_padding\endcsname
%
% We do not define a new \dimen (in 5.x pre-5.1.0 dev branch there
% was a \sphinxverbatimradius when rounded boxes were first introduced,
% but we removed it).
\define@key{sphinx}{pre_border-top-left-radius}{\def\spx@pre@radius@topleft{#1}}
\define@key{sphinx}{pre_border-top-right-radius}{\edef\spx@pre@radius@topright{#1}}
\define@key{sphinx}{pre_border-bottom-right-radius}{\def\spx@pre@radius@bottomright{#1}}
\define@key{sphinx}{pre_border-bottom-left-radius}{\def\spx@pre@radius@bottomleft{#1}}
\define@key{sphinx}{pre_border-radius}{%
   \def\spx@pre@radius@topleft    {#1}%
   \let\spx@pre@radius@topright   \spx@pre@radius@topleft
   \let\spx@pre@radius@bottomright\spx@pre@radius@topleft
   \let\spx@pre@radius@bottomleft \spx@pre@radius@topleft
}
% MEMO: keep in mind in using these macros in code elsewhere that they can
% thus be dimen registers or simply dimensional specs such as 3pt
\let\spx@pre@radius@topleft    \z@
\let\spx@pre@radius@topright   \z@
\let\spx@pre@radius@bottomright\z@
\let\spx@pre@radius@bottomleft \z@
\AtBeginDocument{\if1\ifdim\spx@pre@radius@topleft>\z@0\fi
                     \ifdim\spx@pre@radius@topright>\z@0\fi
                     \ifdim\spx@pre@radius@bottomright>\z@0\fi
                     \ifdim\spx@pre@radius@bottomleft>\z@0\fi
                    1\else\spx@RequirePackage@PictIIe\fi}
%
\newif\ifspx@pre@withshadow
\newif\ifspx@pre@insetshadow
% Attention only "none" or "<xoffset> <yoffset> [optional inset]", no color
\define@key{sphinx}{pre_box-shadow}{\spx@pre@box@shadow@setter #1 {} {} \@nnil}%
% TODO add parsing to fetch color... but this requires a TeX layer to convert
% color spec in CSS format to color/xcolor format
\def\spx@pre@box@shadow@setter #1 #2 #3 #4\@nnil{%
  \begingroup\edef\spx@tempa{#1}\expandafter\endgroup
  \ifx\spx@tempa\spxstring@none
      \spx@pre@withshadowfalse
  \else
    \spx@pre@withshadowtrue
    \edef\spx@pre@shadow@xoffset{\number\dimexpr#1\relax sp}%
    \edef\spx@pre@shadow@yoffset{\number\dimexpr#2+\z@\relax sp}%
    \if\relax\detokenize{#3}\relax
      \spx@pre@insetshadowfalse
    \else
      \spx@pre@insetshadowtrue
    \fi
  \fi     
}%
\spx@pre@box@shadow@setter none {} {} \@nnil
%
\newif\ifspx@pre@withbordercolor
\define@key{sphinx}{pre_border-TeXcolor}{%
    \spx@pre@withbordercolortrue
    \definecolor{VerbatimBorderColor}#1% legacy colour name with no sphinx prefix
}
\expandafter\let\expandafter\KV@sphinx@VerbatimBorderColor
                            \csname KV@sphinx@pre_border-TeXcolor\endcsname
\newif\ifspx@pre@withbackgroundcolor
\define@key{sphinx}{pre_background-TeXcolor}{%
    \spx@pre@withbackgroundcolortrue
    \definecolor{VerbatimColor}#1% legacy colour name with no sphinx prefix
}
\expandafter\let\expandafter\KV@sphinx@VerbatimColor
                            \csname KV@sphinx@pre_background-TeXcolor\endcsname
\newif\ifspx@pre@withshadowcolor
\define@key{sphinx}{pre_box-shadow-TeXcolor}{%
    \spx@pre@withshadowcolortrue
    \definecolor{sphinxVerbatimShadowColor}#1%
}
\definecolor{sphinxVerbatimShadowColor}{rgb}{0,0,0}
% topics
\let\spxdimen@topic@border\sphinxshadowrule
\define@key{sphinx}{div.topic_border-top-width}{\def\spx@topic@border@top{#1}}
\define@key{sphinx}{div.topic_border-right-width}{\def\spx@topic@border@right{#1}}
\define@key{sphinx}{div.topic_border-bottom-width}{\def\spx@topic@border@bottom{#1}}
\define@key{sphinx}{div.topic_border-left-width}{\def\spx@topic@border@left{#1}}
% attention currently accepts only one dimension specification
\define@key{sphinx}{div.topic_border-width}{%
   \spxdimen@topic@border\dimexpr #1\relax
   \def\spx@topic@border@top  {\spxdimen@topic@border}%
   \let\spx@topic@border@right \spx@topic@border@top
   \let\spx@topic@border@bottom\spx@topic@border@top
   \let\spx@topic@border@left  \spx@topic@border@top
}
\let\spx@topic@border@top   \spxdimen@topic@border
\let\spx@topic@border@right \spx@topic@border@top
\let\spx@topic@border@bottom\spx@topic@border@top
\let\spx@topic@border@left  \spx@topic@border@top
\expandafter\let\expandafter\KV@sphinx@shadowrule
                            \csname KV@sphinx@topic_border-width\endcsname
\newif\ifspx@topic@border@open % defaults to false (legacy)
\define@key{sphinx}{div.topic_box-decoration-break}%
           {\begingroup\edef\spx@tempa{#1}\expandafter\endgroup
            \ifx\spx@tempa\spxstring@clone
                 \spx@topic@border@openfalse
            \else\spx@topic@border@opentrue\fi}%
%
% MEMO: \sphinxshadowsep not used anywhere anymore in code base and to be removed
\define@key{sphinx}{topic_padding-top}{\def\spx@topic@padding@top{#1}}
\define@key{sphinx}{topic_padding-right}{\def\spx@topic@padding@right{#1}}
\define@key{sphinx}{topic_padding-bottom}{\def\spx@topic@padding@bottom{#1}}
\define@key{sphinx}{topic_padding-left}{\def\spx@topic@padding@left{#1}}
\define@key{sphinx}{topic_padding}{%
   \def\spx@topic@padding@top   {#1}%
   \let\spx@topic@padding@right \spx@topic@padding@top
   \let\spx@topic@padding@bottom\spx@topic@padding@top
   \let\spx@topic@padding@left  \spx@topic@padding@top
}
\def\spx@topic@padding@top   {5pt}% no usage anymore of \sphinxshadowsep dimen register
\let\spx@topic@padding@right \spx@topic@padding@top
\let\spx@topic@padding@bottom\spx@topic@padding@top
\let\spx@topic@padding@left  \spx@topic@padding@top
\expandafter\let\expandafter\KV@sphinx@shadowsep
                            \csname KV@sphinx@topic_padding\endcsname
%
\define@key{sphinx}{div.topic_border-top-left-radius}{\def\spx@topic@radius@topleft{#1}}
\define@key{sphinx}{div.topic_border-top-right-radius}{\def\spx@topic@radius@topright{#1}}
\define@key{sphinx}{div.topic_border-bottom-right-radius}{\def\spx@topic@radius@bottomright{#1}}
\define@key{sphinx}{div.topic_border-bottom-left-radius}{\def\spx@topic@radius@bottomleft{#1}}
\define@key{sphinx}{div.topic_border-radius}{%
   \def\spx@topic@radius@topleft    {#1}%
   \let\spx@topic@radius@topright   \spx@topic@radius@topleft
   \let\spx@topic@radius@bottomright\spx@topic@radius@topleft
   \let\spx@topic@radius@bottomleft \spx@topic@radius@topleft
}
\let\spx@topic@radius@topleft    \z@
\let\spx@topic@radius@topright   \z@
\let\spx@topic@radius@bottomright\z@
\let\spx@topic@radius@bottomleft \z@
\AtBeginDocument{\if1\ifdim\spx@topic@radius@topleft>\z@0\fi
                     \ifdim\spx@topic@radius@topright>\z@0\fi
                     \ifdim\spx@topic@radius@bottomright>\z@0\fi
                     \ifdim\spx@topic@radius@bottomleft>\z@0\fi
                    1\else\spx@RequirePackage@PictIIe\fi}
%
\newif\ifspx@topic@withshadow
\newif\ifspx@topic@insetshadow
% Attention only "none" or "<xoffset> <yoffset> [optional inset]", no color
\define@key{sphinx}{div.topic_box-shadow}{\spx@topic@box@shadow@setter #1 {} {} \@nnil}%
\def\spx@topic@box@shadow@setter #1 #2 #3 #4\@nnil{%
  \begingroup\edef\spx@tempa{#1}\expandafter\endgroup
  \ifx\spx@tempa\spxstring@none
      \spx@topic@withshadowfalse
  \else
    \spx@topic@withshadowtrue
    \edef\spx@topic@shadow@xoffset{\number\dimexpr#1\relax sp}%
    \edef\spx@topic@shadow@yoffset{\number\dimexpr#2+\z@\relax sp}%
    \if\relax\detokenize{#3}\relax
      \spx@topic@insetshadowfalse
    \else
      \spx@topic@insetshadowtrue
    \fi
  \fi     
}%
\spx@topic@box@shadow@setter 4pt 4pt {} \@nnil
% Suport for legacy shadowsize, the \sphinxshadowsize \dimen register
% is not used anymore and should not even be allocated in future
\define@key{sphinx}{shadowsize}{%
  \edef\spx@topic@shadow@xoffset{\number\dimexpr#1\relax sp}%
  \let\spx@topic@shadow@yoffset\spx@topic@shadow@xoffset
  \ifdim\spx@topic@shadow@xoffset=\z@
      \spx@topic@box@withshadowtrue
  \else
      \spx@topic@box@withshadowfalse
      \spx@topic@box@shadow@insetfalse
  \fi
}%
\definecolor{sphinxTopicBorderColor}{rgb}{0,0,0}
\definecolor{sphinxTopicBackgroundColor}{rgb}{1,1,1}
\definecolor{sphinxTopicShadowColor}{rgb}{0,0,0}
\newif\ifspx@topic@withbordercolor
\define@key{sphinx}{div.topic_border-TeXcolor}{%
    \spx@topic@withbordercolortrue
    \definecolor{sphinxTopicBorderColor}#1%
}
\newif\ifspx@topic@withbackgroundcolor
\define@key{sphinx}{div.topic_background-TeXcolor}{%
    \spx@topic@withbackgroundcolortrue
    \definecolor{sphinxTopicBackgroundColor}#1%
}
\newif\ifspx@topic@withshadowcolor
\define@key{sphinx}{div.topic_box-shadow-TeXcolor}{%
    \spx@topic@withshadowcolortrue
    \definecolor{sphinxTopicShadowColor}#1%
}
% warning, caution, attention, danger, error
\def\spx@tempa#1{%
  \expandafter\spx@tempb
% MEMO: the diverging naming of first one is conditioned at this time by the fact 
% that sphinxnotice environment must work both for these admonitions and the
% note, tip etc... ones
  \csname spx@opt@#1border\expandafter\endcsname
  \csname spx@#1@border@top\expandafter\endcsname
  \csname spx@#1@border@right\expandafter\endcsname
  \csname spx@#1@border@bottom\expandafter\endcsname
  \csname spx@#1@border@left\expandafter\endcsname
  \csname ifspx@#1@border@open\expandafter\endcsname
  \csname spx@#1@border@opentrue\expandafter\endcsname
  \csname spx@#1@border@openfalse\endcsname
  {#1}%
}%
\def\spx@tempb #1#2#3#4#5#6#7#8#9{%
  \define@key{sphinx}{div.#9_border-top-width}{\def#2{##1}}%
  \define@key{sphinx}{div.#9_border-right-width}{\def#3{##1}}%
  \define@key{sphinx}{div.#9_border-bottom-width}{\def#4{##1}}%
  \define@key{sphinx}{div.#9_border-left-width}{\def#5{##1}}%
  \define@key{sphinx}{div.#9_border-width}{\def#1{##1}\def#2{#1}\let#3#2\let#4#2\let#5#2}%
  \def#1{1pt}\let#2#1\let#3#2\let#4#2\let#5#2%
  \newif#6%
  \define@key{sphinx}{div.#9_box-decoration-break}%
           {\begingroup\edef\spx@tempa{##1}\expandafter\endgroup
            \ifx\spx@tempa\spxstring@clone#8\else#7\fi}%
  \expandafter\let\csname KV@sphinx@#9border\expandafter\endcsname
                  \csname KV@sphinx@div.#9_border-width\endcsname
}
\spx@tempa{warning}
\spx@tempa{caution}
\spx@tempa{attention}
\spx@tempa{danger}
\spx@tempa{error}

\def\spx@tempa#1{%
  \expandafter\spx@tempb
  \csname spx@#1@padding\expandafter\endcsname
  \csname spx@#1@padding@top\expandafter\endcsname
  \csname spx@#1@padding@right\expandafter\endcsname
  \csname spx@#1@padding@bottom\expandafter\endcsname
  \csname spx@#1@padding@left\expandafter\endcsname
% MEMO: this is to keep same behaviour as prior to 5.1.0 for which
% no key to set padding adjusted and border+padding was kept constant
  \csname spx@opt@#1border\endcsname
  {#1}%
}%
\def\spx@tempb #1#2#3#4#5#6#7{%
  \define@key{sphinx}{div.#7_padding-top}{\def#2{##1}}%
  \define@key{sphinx}{div.#7_padding-right}{\def#3{##1}}%
  \define@key{sphinx}{div.#7_padding-bottom}{\def#4{##1}}%
  \define@key{sphinx}{div.#7_padding-left}{\def#5{##1}}%
  \define@key{sphinx}{div.#7_padding}{\def#1{##1}\def#2{#1}\let#3#2\let#4#2\let#5#2}%
% MEMO: prior to 5.1.0 padding was not separately customizable
% This keeps exactly the strange behaviour as prior to 5.1.0
% which used to be hard-coded in the sphinxheavybox environment
  \def#1{\dimexpr.6\baselineskip-#6\relax}%
  \let#2#1\let#3#2\let#4#2\let#5#2%
}
\spx@tempa{warning}
\spx@tempa{caution}
\spx@tempa{attention}
\spx@tempa{danger}
\spx@tempa{error}

\def\spx@tempa#1{%
  \expandafter\spx@tempb
  \csname spx@#1@radius@topleft\expandafter\endcsname
  \csname spx@#1@radius@topright\expandafter\endcsname
  \csname spx@#1@radius@bottomright\expandafter\endcsname
  \csname spx@#1@radius@bottomleft\endcsname
  {#1}%
}%
\def\spx@tempb #1#2#3#4#5{%
  \define@key{sphinx}{div.#5_border-top-left-radius}{\def#1{##1}}%
  \define@key{sphinx}{div.#5_border-top-right-radius}{\def#2{##1}}%
  \define@key{sphinx}{div.#5_border-bottom-right-radius}{\def#3{##1}}%
  \define@key{sphinx}{div.#5_border-bottom-left-radius}{\def#4{##1}}%
  \define@key{sphinx}{div.#5_border-radius}{\def#1{##1}\let#2#1\let#3#1\let#4#1}%
  \let#1\z@\let#2#1\let#3#2\let#4#2%
  \AtBeginDocument{\if1\ifdim#1>\z@0\fi
    \ifdim#2>\z@0\fi
    \ifdim#3>\z@0\fi
    \ifdim#4>\z@0\fi
    1\else\spx@RequirePackage@PictIIe\fi}%
}
\spx@tempa{warning}
\spx@tempa{caution}
\spx@tempa{attention}
\spx@tempa{danger}
\spx@tempa{error}

\def\spx@tempa#1{%
  \expandafter\spx@tempb
  \csname ifspx@#1@withshadow\expandafter\endcsname
  \csname ifspx@#1@insetshadow\expandafter\endcsname
  \csname ifspx@#1@withshadowcolor\expandafter\endcsname
  \csname ifspx@#1@withbordercolor\expandafter\endcsname
  \csname ifspx@#1@withbackgroundcolor\endcsname
}%
\def\spx@tempb#1#2#3#4#5{\newif#1\newif#2\newif#3\newif#4\newif#5}%
\spx@tempa{warning}
\spx@tempa{caution}
\spx@tempa{attention}
\spx@tempa{danger}
\spx@tempa{error}

\def\spx@tempa#1{%
  \expandafter\spx@tempb
  \csname spx@#1@withshadowtrue\expandafter\endcsname
  \csname spx@#1@withshadowfalse\expandafter\endcsname
  \csname spx@#1@insetshadowtrue\expandafter\endcsname
  \csname spx@#1@insetshadowfalse\expandafter\endcsname
  \csname spx@#1@box@shadow@setter\expandafter\endcsname
  \csname spx@#1@box@shadow@xoffset\expandafter\endcsname
  \csname spx@#1@box@shadow@yoffset\endcsname
  {#1}%
}%
\def\spx@tempb#1#2#3#4#5#6#7#8{%
  \define@key{sphinx}{div.#8_box-shadow}{#5##1 {} {} \@nnil}%
  \def#5##1 ##2 ##3 ##4\@nnil{%
  \begingroup\edef\spx@tempa{##1}\expandafter\endgroup
  \ifx\spx@tempa\spxstring@none
        #2%
  \else #1\edef#6{\number\dimexpr##1\relax sp}%
          \edef#7{\number\dimexpr##2+\z@\relax sp}%
    \if\relax\detokenize{##3}\relax#4\else#3\fi
  \fi     
  }#5none {} {} \@nnil
}
\spx@tempa{warning}
\spx@tempa{caution}
\spx@tempa{attention}
\spx@tempa{danger}
\spx@tempa{error}

\def\spx@tempa#1{%
  \expandafter\spx@tempb
  \csname spx@#1@withbordercolortrue\expandafter\endcsname
  \csname spx@#1@withbackgroundcolortrue\expandafter\endcsname
  \csname spx@#1@withshadowcolortrue\endcsname
  {#1}%
}
\def\spx@tempb#1#2#3#4{%
  \definecolor{sphinx#4BorderColor}{rgb}{0,0,0}%
  \definecolor{sphinx#4BgColor}{rgb}{1,1,1}%
  \definecolor{sphinx#4ShadowColor}{rgb}{0,0,0}%
  \define@key{sphinx}{div.#4_border-TeXcolor}{#1\definecolor{sphinx#4BorderColor}##1}%
  \define@key{sphinx}{div.#4_background-TeXcolor}{#2\definecolor{sphinx#4BgColor}##1}%
  \define@key{sphinx}{div.#4_box-shadow-TeXcolor}{#3\definecolor{sphinx#4ShadowColor}##1}%
  \expandafter\let\csname KV@sphinx@#4BorderColor\expandafter\endcsname
                  \csname KV@sphinx@div.#4_border-TeXcolor\endcsname
  \expandafter\let\csname KV@sphinx@#4BgColor\expandafter\endcsname
                  \csname KV@sphinx@div.#4_background-TeXcolor\endcsname
}
\spx@tempa{warning}
\spx@tempa{caution}
\spx@tempa{attention}
\spx@tempa{danger}
\spx@tempa{error}


\DeclareDefaultOption{\@unknownoptionerror}
\ProcessKeyvalOptions*
% don't allow use of maxlistdepth via \sphinxsetup.
\DisableKeyvalOption{sphinx}{maxlistdepth}
\DisableKeyvalOption{sphinx}{numfigreset}
\DisableKeyvalOption{sphinx}{nonumfigreset}
\DisableKeyvalOption{sphinx}{mathnumfig}
% FIXME: this is unrelated to an option, move this elsewhere
% To allow hyphenation of first word in narrow contexts; no option,
% customization to be done via 'preamble' key
\newcommand*\sphinxAtStartPar{\leavevmode\nobreak\hskip\z@skip}
% No need for the \hspace{0pt} trick (\hskip\z@skip) with luatex
\ifdefined\directlua\let\sphinxAtStartPar\@empty\fi
% user interface: options can be changed midway in a document!
\newcommand\sphinxsetup[1]{\setkeys{sphinx}{#1}}


%% MISCELLANEOUS CONTEXT
%
% flag to be set in a framed environment
% (defined here as currently needed by three sphinxlatex....sty files and
% even if not needed if such files are replaced, the definition does no harm)
\newif\ifspx@inframed
%
% \spx@ifcaptionpackage (defined at begin document)
%     is needed currently in macros from:
%     sphinxlatexliterals.sty (sphinxVerbatim)
%     sphinxlatextables.sty   (for some macros used in the table templates)
%
% \sphinxcaption is mark-up injected by the tabular and tabulary templates
%     it is defined in sphinxlatextables.sty
%
% store the original \caption macro for usage with figures inside longtable
% and tabulary cells. Make sure we get the final \caption in presence of
% caption package, whether the latter was loaded before or after sphinx.
\AtBeginDocument{%
    \let\spx@originalcaption\caption
    \@ifpackageloaded{caption}
      {\let\spx@ifcaptionpackage\@firstoftwo
       \caption@AtBeginDocument*{\let\spx@originalcaption\caption}%
% in presence of caption package, drop our own \sphinxcaption whose aim was to
% ensure same width of caption to all kinds of tables (tabular(y), longtable),
% because caption package has its own width (or margin) option
       \def\sphinxcaption{\caption}%
      }%
      {\let\spx@ifcaptionpackage\@secondoftwo}%
}

%% PASS OPTIONS
%
% pass options to hyperref; it must not have been loaded already
\input{sphinxoptionshyperref.sty}
% pass options to geometry; it must not have been loaded already
\input{sphinxoptionsgeometry.sty}


%% COLOR (general)
%
% FIXME: these two should be deprecated
%
% FIXME: \normalcolor should be used and \py@NormalColor never defined
\def\py@NormalColor{\color{black}}
% FIXME: \color{TitleColor} should be used directly and \py@TitleColor
% should never get defined.
\def\py@TitleColor{\color{TitleColor}}


%% PACKAGES
%
% as will be indicated below, secondary style files load some more packages
%
% For \text macro (sphinx.util.texescape)
% also for usage of \firstchoice@true(false) in sphinxlatexgraphics.sty
\RequirePackage{amstext}
% It was passed "warn" option from latex template in case it is already loaded
% via some other package before \usepackage{sphinx} in preamble
\RequirePackage{textcomp}
% For the H specifier. Do not \restylefloat{figure}, it breaks Sphinx code
% for allowing figures in tables.
\RequirePackage{float}
% For floating figures in the text. Better to load after float.
\RequirePackage{wrapfig}
% Provides \captionof, used once by latex writer (\captionof{figure})
\RequirePackage{capt-of}
% Support hlist directive
\RequirePackage{multicol}


%% GRAPHICS
%
% It will always be needed, so let's load it here
\RequirePackage{graphicx}
\input{sphinxlatexgraphics.sty}


%% FRAMED ENVIRONMENTS
%
\RequirePackage{sphinxpackageboxes}
% This macro is possibly executed at begin document if the check
% whether radii setting options have been used turns out positive
\def\spx@RequirePackage@PictIIe{%
\IfFileExists{pict2e.sty}
   {\RequirePackage{pict2e}}
   {\PackageWarningNoLine{sphinx}{%
       The package pict2e is required for rounded boxes.\MessageBreak
       It does not seem to be available on your system.\MessageBreak
       Options for setting radii will thus be ignored}%
    \AtEndDocument{\PackageWarningNoLine{sphinx}{%
       I issued a warning which may have gotten lost in the\MessageBreak
       gigantic console output: pict2e.sty was not found,\MessageBreak
       and radii setting options have been ignored}}%
    \def\spx@boxes@fcolorbox@rounded{\spx@boxes@fcolorbox}%
   }%
}%
% This at begin document will be executed after \spx@RequirePackage@PictIIe
\AtBeginDocument{%
    \@ifpackageloaded{pict2e}{\let\spx@ifpackageloaded@pictiie\@firstoftwo}%
                             {\let\spx@ifpackageloaded@pictiie\@secondoftwo}%
}%
\input{sphinxlatexadmonitions.sty}
\input{sphinxlatexliterals.sty}
\input{sphinxlatexshadowbox.sty}


%% CONTAINERS
%
\input{sphinxlatexcontainers.sty}


%% PYGMENTS
% stylesheet for highlighting with pygments
\RequirePackage{sphinxhighlight}


%% TABLES
%
\input{sphinxlatextables.sty}


%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS
%
\input{sphinxlatexnumfig.sty}


%% LISTS
%
\input{sphinxlatexlists.sty}


%% FOOTNOTES
%
% Support scopes for footnote numbering
% This is currently stepped at each input file
\newcounter{sphinxscope}
\newcommand{\sphinxstepscope}{\stepcounter{sphinxscope}}
% We ensure \thesphinxscope expands to digits tokens, independently of language
\renewcommand{\thesphinxscope}{\number\value{sphinxscope}}
\newcommand\sphinxthefootnotemark[2]{%
   % this is used to make reference to an explicitly numbered footnote not on same page
   % #1=label of footnote text, #2=page number where footnote text was printed
   \ifdefined\pagename
      \pagename\space#2, % <- space
    \else
      p. #2, % <- space
   \fi #1% no space
}
% support large numbered footnotes in minipage; but this is now obsolete
% from systematic use of savenotes environment around minipages
\def\thempfootnote{\arabic{mpfootnote}}
% This package is needed to support hyperlinked footnotes in tables and
% framed contents, and to allow code-blocks in footnotes.
\RequirePackage{sphinxpackagefootnote}


%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS
%
\input{sphinxlatexindbibtoc.sty}


%% STYLING
%
\input{sphinxlatexstylepage.sty}
\input{sphinxlatexstyleheadings.sty}
\input{sphinxlatexstyletext.sty}


%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS
%
\input{sphinxlatexobjects.sty}


% FIXME: this line should be dropped, as "9" is default anyhow.
\ifdefined\pdfcompresslevel\pdfcompresslevel = 9 \fi


\endinput
